.TITLE DVINT .IDENT /03.02/ ; ; Copyright (c) 1995 by Mentec, Inc., U.S.A. ; All rights reserved ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; P. J. BEZEREDI 04-OCT-77 ; ; ; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY: ; ; P. J. BEZEREDI ; T. LEKAS ; ; ; MODIFIED BY: ; ; J. W. BERZLE 07-SEP-83 03.00 ; ; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES ; ; B. S. MCCARTHY 30-MAy-84 03.01 ; ; BM309 -- STREAMLINE PORCESSING OF INTERRUPTS ; ; Modified for RSX-11M-PLUS V4.6 by: ; ; D. Carroll 18-Oct-1995 03.02 ; DC404 - Include PSECT definitions to allow to extend ; ICB pool automatically ; ; ; ; ;DC404 ; OVERLAPPED SEEK/MIXED MASSBUS/LOADABLE DRIVER INTERRUPT ROUTINES ; FOR RH11/RH70(DB,DR,DS,MM,MF,EM) AND RK611(DM). ; ; MACRO LIBRARY CALLS ; .MCALL DCBDF$,HWDDF$,KRBDF$,PCBDF$,SCBDF$,BGCK$A DCBDF$ ;DEFINE DCB OFFSETS HWDDF$ ;DEFINE HARDWARE REGISTERS KRBDF$ ;DEFINE KRB OFFSETS PCBDF$ ;DEFINE PARTITION OFFSETS SCBDF$ ;DEFINE SCB OFFSETS .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 ; ; EQUATED SYMBOLS ; ;RH11/70 REGISTER OFFSETS RHCS2= 10 ;OFFSET TO CONTROL STATUS RGISTER 2 RHAS= 16 ;OFFSET TO ATTENTION SUMMARY REGISTER RHDT= 26 ;OFFSET TO DRIVE TYPE REGISTER ;RK611 REGISTER OFFSETS RKCS2= 10 ;OFFSET TO CONTROL STATUS REGISTER 2 RKAS= 16 ;OFFSET TO ATTENTION/OFFSET REGISTER IE= 100 ;INTERRUPT ENABLE BIT IN CSR CERR= 100000 ;ERROR BIT IN CSR RDY= 200 ;READY BIT IN CSR ;+ ; THIS MACRO DEFINES THE CODE USED TO SET THE INTERRUPT PRIORITY ; AND CALCULATE THE CONTROLLER INDEX. ON NON D-SPACE SYSTEMS, THE ; ROUTINE $INTSE IS CALLED. FOR D-SPACE SYSTEMS, CODE TO EMULATE ; THE ROUTINE $INTSE IS USED TO LOAD THE NEW PRIORITY DIRECTLY AND ; THEN RETURN BACK INTO THE MAINLINE CODE IN $INTSE. ; ; NOTE: CHANGES TO THIS MACRO MUST FOLLOW ANY CHANGES IN THE CODE ; IN $INTSE (SYSXT) AND THE CLOCK INTERRUPT CODE (TDSCH). ;- .MACRO INTSAV .IF NDF K$$DAS JSR R5,$INTSE ;;;CALL INTERRUPT SAVE ROUTINE .WORD ^C&PR7 ;;;NEW PRIORITY IS PR5 .IFF JSR R5,(PC) ;;;SAVE R5 WITHOUT DISTURBING CC'S JSR R4,(PC) ;;;SAVE R4 WITHOUT DISTURBING CC'S MFPS R4 ;;;GET PSW INCLUDING CONTROLLER INDEX BIC #^C<17>,R4 ;;;ISOLATE THE CONTROLLER INDEX ASL R4 ;;;MAKE IT A WORD INDEX DEC $STKDP ;;;SWITCH STACKS? 1$: BIC #^C&PR7,@#PS ;;;SET NEW PRIORITY TO PR5 CACHE$ SAVE ;;;SAVE BYPASS STATE OF CACHE MOV #$INTSF,-(SP) ;;;SET TO RETURN BACK INTO $INTSE .ENDC .ENDM INTSAV ;+ ; **-$RHALT-RH11/RH70 INTERRUPT HANDLER ; ; THIS ROUTINE IS ENTERED DIRECTLY VIA AN RH11/70 INTERRUPT VECTOR. ; USING THE CONTROLLER INDEX, THE KRB OF THE INTERRUPTING RH11/70 IS ; FOUND. IF THE INTERRUPT WAS FROM A DATA TRANSFER OPERATION, THE ; INITIAL ATTENTION BIT SCAN IS BYPASSED AND A FORK BLOCK IS QUEUED TO ; THE DRIVER. IF THE INTERRUPT WAS CAUSED BY A POSITIONING OPERATION, ; THE CURRENT ACTIVE ATTENTION BITS ARE USED TO INDEX INTO A TABLE OF ; UCB ADDRESSES AND A CALL IS MADE TO THE PROPER UNIT'S DRIVER WHICH ; THEN IMMEDIATELY $FORK AND RETURN HERE WHERE THE NEXT ATTENTION BIT ; WILL BE TESTED. WHEN ALL EIGHT ATTENTION BITS HAVE BEEN TESTED A ; CHECK IS MADE TO SEE IF ANY ATTENTIONS MAY HAVE COME UP. IF SO, THE ; ALGORITHM IS REPEATED UNTIL NO ATTENTIONS BITS REMAIN SET. ALL ; ATTENTIONS FROM UNITS WHICH ARE NOT CONFIGURED INTO THE DATA BASE ; WILL BE EXPLICITLY CLEARED. ; ; IF THE RH CONTROLLER HAS A UNIT WHICH HAS SLAVE UNITS (TM02/03) THE ; ATTENTION WILL BE CLEARED BASED ON THE MASTER'S UNIT NUMBER (U.UNIT). ; IF OVERLAPPED OPERATIONS ARE ENABLED AND NO DATA TRANSFER CURRENTLY ; IS ACTIVE, THE MASTER'S DRIVER WILL BE CALLED WITH THE UCB FOUND IN ; THE UCB LIST. ; ; INPUTS: ; NONE. ; ; OUTPUTS: ; ATTENTION REGISTER CLEARED (ALL PENDING ATTENTIONS PROCESSED). ; ; ALL REGISTERS ARE PRESERVED (R4 AND R5 VIA $INTSE). ;- .IF DF R$$HDV $RHALT::INTSAV ;;;CALL $INTSE AND SET PRIORITY MOV R3,-(SP) ;;;SAVE REGISTERS MOV R2,-(SP) ;;;... MOV R1,-(SP) ;;;... MOV R0,-(SP) ;;;... MOV $RHCTB(R4),R3 ;;;GET KRB OF INTERRUPTING CONTROLLER 5$: MOV (R3),R4 ;;;GET IT'S CSR ADDRESS ADD #RHAS,R4 ;;;POINT TO ATTENTION SUMMARY REGISTER BIT #KS.DIP,K.STS(R3) ;;;DATA TRANSFER IN PROGRESS? BNE 80$ ;;;IF NE YES 10$: MOV R3,R5 ;;;COPY KRB ADDRESS ADD K.OFF(R3),R5 ;;;POINT TO UCB TABLE TSTB (R4) ;;;ANY ATTENTIONS ACTIVE? BNE 20$ ;;;IF NE ATTENTIONS WERE UP 15$: MOV (SP)+,R0 ;;;RESTORE REGISTERS MOV (SP)+,R1 ;;;... MOV (SP)+,R2 ;;;... MOV (SP)+,R3 ;;;... RETURN ;;;RETURN TO INTERRUPTED PROCESS ; ; ATTENTIONS WERE FOUND TO BE ACTIVE. ; 20$: MOV #177001,R1 ;;;PRESET ATTENTION SUMMARY MASK 25$: BITB R1,(R4) ;;;IS THIS ATTENTION UP? BNE 40$ ;;;IF NE YES 30$: TST (R5)+ ;;;POINT TO NEXT UCB ADDRESS CMP #-1,(R5) ;;;END OF UCB TABLE? BEQ 35$ ;;;IF EQ YES ASL R1 ;;;NO, SHIFT ATTENTION MASK BCC 10$ ;;;IF CC ALL ATTENTION BITS SCANNED TSTB (R4) ;;;ANY ATTENTIONS STILL PENDING? BEQ 15$ ;;;IF EQ NO BR 25$ ;;;TRY THE NEXT ONE 35$: SWAB R1 ;;;PUT REMAINING MASKS IN LOW BYTE BITB R1,(R4) ;;;UNCONFIGURED ATTENTIONS ACTIVE? BEQ 10$ ;;;IF EQ NO MOVB (R4),R2 ;;;COPY ACTIVE ATTENTION BITS COMB R1 ;;;TOGGLE MASK BITS BICB R1,R2 ;;;ISOLATE UNCONFIGURED ATTENTION BITS MOVB R2,(R4) ;;;DROP ALL UNCONFIGURED ATTENTIONS BR 10$ ;;;TRY FOR MORE ATTENTION BITS ; ; AT THIS POINT WE ARE POINTING TO THE UCB ADDRESS OF AN ; ACTIVE ATTENTION. ; 40$: MOV (R5),R2 ;;;COPY UCB ADDRESS BNE 45$ ;;;IF NE UCB REALLY EXISTS MOVB R1,(R4) ;;;DROP THIS UNIT'S ATTENTION BR 30$ ;;;LOOP FOR MORE ATTENTIONS 45$: MOV U.SCB(R2),R2 ;;;GET SCB ADDRESS BITB #S3.ATN,S.ST3(R2) ;;;WILL DRIVER CLEAR THE ATTENTION? BNE 50$ ;;;IF NE YES MOVB R1,(R4) ;;;DROP THIS UNIT'S ATTENTION 50$: MOV (R5),R5 ;;;RETREIVE UCB ADDRESS 55$: CALL MAPDRV ;;;MAP AND CALL DRIVER BIT #KS.DIP,K.STS(R3) ;;;DATA TRANSFER INTERRUPT? BEQ 10$ ;;;IF EQ NO 70$: BIC #KS.DIP,K.STS(R3) ;;;RESET DATA TRANSFER IN PROGRESS BR 5$ ;;;TRY FOR MORE ATTENTIONS ; ; DATA TRANSFER WAS IN PROGRESS. ; 80$: MOV K.OWN(R3),R5 ;;;GET OWNER'S UCB ADDRESS MOV U.SCB(R5),R0 ;;;GET SCB ADDRESS BITB #S3.ATN,S.ST3(R0) ;;;WILL DRIVER CLEAR THE ATTENTION? BNE 55$ ;;;IF NE YES MOVB U.UNIT(R5),R2 ;;;GET OWNER'S UNIT NUMBER ASL R2 ;;;CONVERT TO A WORD INDEX MOV $BTMSK(R2),(R4) ;;;ALWAYS DROP OWNER'S ATTENTION BITB #S3.SLV,S.ST3(R0) ;;;SLAVE UNIT SUPPORTED? BNE 55$ ;;;IF NE YES MOV #70$,-(SP) ;;;ADDRESS TO RETRUN TO AFTER $FORK CALLR FRKDRV ;;;FAKE THE DRIVER'S $FORK .ENDC ;+ ; **-$DMALT-RK611 RK06/RK07 INTERRUPT HANDLER ; ; THIS ROUTINE IS ENTERED DIRECTLY FROM THE RK611 INTERRUPT VECTOR. ; USING THE CONTROLLER INDEX, THE KRB OF THE INTERRUPTING RK611 IS ; FOUND. IF THE INTERRUPT WAS CAUSED BY THE CONTROLLER, THE POSITIONING ; FLAG IN THE UNIT'S UCB IS TESTED TO SEE IF A DRIVE INTERRUPT IS FORTH- ; COMING. IT ONE IS, THE INTERRUPT IS DISMISSED. IF NOT, A FORK BLOCK ; IS QUEUED TO THE DRIVER. AN INTERRUPT FROM THE DRIVE (USUALLY FROM ; A POSITIONING OPERATION) WILL CAUSE THE ATTENTION BITS ARE USED TO ; INDEX INTO A TABLE OF UCB ADDRESSES AND A CALL IS MADE TO THE PROPER ; DRIVER. ; ; IF AN UNCONFIGURED (IN THE DATA BASE) UNIT RAISES IT'S ATTENTION, ; WE WILL CRASH THE SYSTEM WITH R0 CONTAINING THE CURRENT ATTENTION ; BITS IN THE HIGH BYTE. THIS IS BECAUSE THE ONLY METHOD OF CLEARING ; AN ATTENTION IS TO SELECT AND CLEAR THE DRIVE AT THE DRIVER LEVEL. ; THIS CANNOT BE DONE BECAUSE THE UNIT HAS NO DATA STRUCTURE. ; ; INPUTS: ; NONE. ; ; OUTPUTS: ; NONE. ; ; ALL REGISTERS ARE PRESERVED (R4 AND R5 VIA $INTSE). ;- .IF DF R$$611 $DMALT::INTSAV ;;;CALL $INTSE AND SET PRIORITY MOV R3,-(SP) ;;;SAVE WORKING REGISTERS MOV R2,-(SP) ;;;... MOV R1,-(SP) ;;;... MOV R0,-(SP) ;;;... MOV $DMCTB(R4),R3 ;;;GET KRB OF INTERRUPTING CONTROLLER 5$: MOV (R3),R4 ;;;GET IT'S CSR ADDRESS BIT #KS.DIP,K.STS(R3) ;;;DATA TRANSFER IN PROGRESS? BNE 60$ ;;;IF NE YES CLR R1 ;;;PRESET INITIAL ATTENTION MASK 10$: MOV (R3),R4 ;;;RETREIVE CSR ADDRESS MOV R3,R5 ;;;COPY KRB ADDRESS ADD K.OFF(R3),R5 ;;;POINT TO UCB TABLE MOV RKAS(R4),R0 ;;;GET ATTENTION/OFFSET REGISTER BIC #377,R0 ;;;ISOLATE ATTENTION BITS SWAB R0 ;;;PUT THEM IN THE LOW BYTE CMP R0,R1 ;;;ANY NEW ATTENTIONS UP? BNE 20$ ;;;IF NE YES 15$: MOV (SP)+,R0 ;;;RESTORE REGISTERS MOV (SP)+,R1 ;;;... MOV (SP)+,R2 ;;;... MOV (R4),R3 ;;;GET CONTENTS OF CSR BIC #RDY!CERR,R3 ;;;CLEAR THE READY AND ERROR BITS BIS #IE,R3 ;;;SET THE INTERRUPT ENABLE BIT MOV R3,(R4) ;;;REENABLE INTERRUPTS MOV (SP)+,R3 ;;;RESTORE REGISTER RETURN ;;;RETURN TO INTERRUPTED PROCESS ; ; ATTENTIONS WERE FOUND TO BE ACTIVE. ; 20$: BIC R1,R0 ;;;ISOLATE LATEST ATTENTION BITS BIS R0,R1 ;;;SET LATEST BITS IN MASK 25$: ASR R0 ;;;IS THIS UNIT'S ATTENTION UP? BCS 40$ ;;;IF CS YES 30$: TST (R5)+ ;;;POINT TO NEXT UCB ADDRESS CMP #-1,(R5) ;;;END OF UCB TABLE? BNE 25$ ;;;IF NE NO, TRY NEXT UNIT TST R0 ;;;ANY ATTENTIONS REMAINING? BEQ 10$ ;;;IF EQ NO 35$: MOV R1,R0 ;;;GET LATEST ATTENTION BITS BGCK$A BF.DVI,BE.FHW,FATAL ;;;UNCONFIGURED DEVICE RAISED ATTENTION BITS BR .-2 ;;;DON'T TEMPT THE SYSTEM!!! ; ; WE FOUND AN ACTIVE ATTENTION. ; 40$: MOV R5,R4 ;;;COPY UCB TABLE POINTER MOV (R5),R5 ;;;GET UCB ADDRESS BEQ 35$ ;;;IF EQ UNIT NOT IN CONFIGURATION CALL MAPDRV ;;;MAP AND CALL DRIVER TST R0 ;;;ANY MORE ATTENTIONS? BEQ 10$ ;;;IF EQ NO MOV R4,R5 ;;;RETREIVE UCB TABLE POINTER BR 30$ ;;;TRY FOR MORE ; ; DATA TRANSFER WAS IN PROGRESS. ; 60$: MOV K.OWN(R3),R5 ;;;GET OWNER'S UCB ADDRESS BITB #3,U.CW2+1(R5) ;;;POSITIONING OPERATION? BEQ 65$ ;;;IF EQ NO MOVB U.UNIT(R5),R2 ;;;RETREIVE UNIT NUMBER ASL R2 ;;;CONVERT TO WORD INDEX MOV $BTMSK(R2),R2 ;;;GET CORRESPONDING BIT MASK SWAB R2 ;;;PUT IT IN THE HIGH BYTE BIT R2,RKAS(R4) ;;;IS OWNER'S ATTENTION BIT SET? BEQ 80$ ;;;IF EQ NO, CONTROLLER CAUSED INTERRUPT 65$: MOV #80$,-(SP) ;;;ADDRESS TO RETURN TO AFTER $FORK CALLR FRKDRV ;;;FAKE THE DRIVER'S $FORK 80$: BIC #KS.DIP,K.STS(R3) ;;;RESET DATA TRANSFER IN PROGRESS BR 5$ ;;;TRY FOR OTHER ATTENTIONS .ENDC ;+ ; **-MAPDRV-MAP AND CALL DRIVER ; ; THIS SUBROUTINE WILL SAVE THE CURRENT INTERRUPT CONTEXT ; (R4 & R5), MAP THE DRIVER, SET THE ERROR LOGGING BITMAP AND ; CALL THE DRIVER. THE DRIVER IS THEN UNMAPPED AND THE INTERRUPT ; CONTEXT IS RESTORED. ; ; INPUTS: ; R3 = KRB ADDRESS OF INTERRUPTING CONTROLLER ; R5 = UCB ADDRESS OF INTERRUPTING UNIT ; ; OUTPUTS: ; R2 IS DESTROYED ; ; DRIVERS ARE CALLED WITH: ; R3 = CURRENT KRB ADDRESS ; R4 = SCB ADDRESS OF INTERRUPTING UNIT ; R5 = UCB ADDRESS OF INTERRUPTING UNIT ;- .IF DF R$$HDV!R$$611 MAPDRV: MOV R4,-(SP) ;;;SAVE CSR ADDRESS MOV U.SCB(R5),R4 ;;;GET ADDRESS OF SCB CMP R3,S.KRB(R4) ;;;DO THE KRB'S MATCH? BNE 40$ ;;;IF NE NO, UNIT IS ON ANOTHER KRB MOV U.DCB(R5),R2 ;;;GET ADDRESS OF DCB MOV KINAR5,-(SP) ;;;SAVE KERNEL INSTR APR 5 .IF DF K$$DAS MOV KDSAR5,-(SP) ;;;SAVE KERNEL DATA APR 5 .IFTF MOV D.PCB(R2),R4 ;;;GET DRIVERS PCB ADDRESS BEQ 10$ ;;;IF EQ DRIVER IS PART OF EXEC MOV P.REL(R4),KINAR5 ;;;MAP DRIVER IN INSTRUCTION SPACE .IFT MOV P.REL(R4),KDSAR5 ;;;MAP DRIVER IN DATA SPACE .IFTF 10$: MOV D.DSP(R2),R4 ;;;GET ADDRESS OF DRIVER DISPATCH TABLE BEQ 30$ ;;;IF EQ DRIVER IS UNLOADED MOV D.VINT+2(R4),-(SP) ;;;GET DRIVER'S INTERRUPT ADDRESS ADD #2,(SP) ;;;POINT TO SECOND ENTRY POINT MOV U.SCB(R5),R4 ;;;RETREIVE SCB ADDRESS BIC #S2.ACT,S.ST2(R4) ;;;SHOW INTERRUPT INACTIVE CALL @(SP)+ ;;;CALL PROPER DRIVER 30$: ;;;REF LABEL .IFT MOV (SP)+,KDSAR5 ;;;RESTORE KERNEL DATA APR 5 .ENDC MOV (SP)+,KINAR5 ;;;RESTORE KERNEL INSTR APR 5 40$: MOV (SP)+,R4 ;;;RESTORE CSR ADDRESS XIT: RETURN ;;; ;+ ; **-FRKDRV-EMULATE A DRIVER'S CALL TO $FORK ; ; THIS ROUTINE WILL SETUP THE STACK IN ORDER TO EMULATE THE ; DRIVER'S CALL TO $FORK. ; ; NOTE: THIS ROUTINE ASSUMES THAT THE DRIVER IS LOADABLE AND LOADED. ; THIS IS DONE BECAUSE THIS ROUTINE IS ONLY CALLED FOR DATA ; TRANSFER INTERRUPTS. ; ; INPUTS: ; R5 = UCB ADDRESS ; (SP) = ADDRESS TO RETURN TO AFTER $FORK ; ; OUTPUTS: ; FORK BLOCK QUEUED ; R0, R1, AND R2 ARE DESTROYED ;- FRKDRV: MOV U.SCB(R5),R4 ;;;GET SCB ADDRESS TST S.FRK+2(R4) ;;;IS THE FORK BLOCK BUSY? BNE XIT ;;;IF NE YES, DROP THE INTERRUPT MOV U.DCB(R5),R2 ;;;GET DCB ADDRESS MOV D.PCB(R2),R1 ;;;GET DRIVER'S PCB ADDRESS MOV D.DSP(R2),R2 ;;;GET ADDRESS OF DRIVER DISPATCH TABLE MOV KISAR5,R0 ;;;SAVE KERNAL APR5 MOV P.REL(R1),KISAR5;;;MAP TO DRIVER MOV D.VINT+2(R2),-(SP) ;;;GET DRIVER'S INTERRUPT ADDRESS MOV R0,KISAR5 ;;;RESTORE APR5 MAPPING BIC #S2.ACT,S.ST2(R4) ;;;SHOW INTERRUPT INACTIVE CALLR $FORK ;;;CREATE A FORK PROCESS .ENDC ;+ ; **-$RHKRB-RH11/RH70 CONTROLLER ONLINE/OFFLINE HANDLER ; ; THIS ENTRY POINT WILL HANDLE RECONFIGURATION CALLS FOR ONLINE ; CONTROLLER AND OFFLINE CONTROLLER FOR THE RH-TYPE CONTROLLERS. ; ; FOR ONLINE, IT WILL DETERMINE WHETHER THE CONTROLLER IS AN ; RH11 (I.E. IT HAS NO RHBAE/RHCS3 REGISTERS) AND THEREFORE MUST ; USE UNIBUS MAPPING REGISTERS, OR WHETHER IT IS AN RH70 (I.E. ; IT HAS RHBAE/RHCS3 REGISTERS) AND WILL SUPPORT DIRECT ACCESS TO ; A 22-BIT ADDRESS SPACE. ; ; FOR OFFLINE, IT WILL SIMPLY CLEAR THE RH SUBSYSTEM. ; ; INPUTS: ; R2=KRB ADDRESS. ; R3=CTB ADDRESS. ; C=1 IF OFFLINE REQUEST. ; C=0 IF ONLINE REQUEST. ; ; OUTPUTS: ; FOR ONLINE, KS.MBC WILL BE SET IF RH70 CONTROLLER AND THE ; OFFSET FROM THE CSR TO THE RHBAE REGISTER WILL BE PLACED ; IN THE KRB. ; FOR OFFLINE, THE RH SUBSYSTEM WILL BE CLEARED. ;- .IF DF R$$HDV $RHKRB::BCS CONCLR ;IF CS OFFLINE, JUST CLEAR RH CALL CONCLR ;GET CSR ADDRESS AND CLEAR RH CALL $SGFIN ;TURN NXM'S INTO SET CARRY BITS MOV R1,R4 ;COPY CSR ADDRESS ADD #RHDT,R1 ;START WITH DRIVE TYPE REGISTER 10$: TST (R1)+ ;IS THE NEXT CONTROLLER REGISTER THERE? BCC 10$ ;IF CC YES MOV #40,RHCS2(R4) ;CLEAR RH CONTROLLER SUB R4,R1 ;CALCULATE # OF REGISTERS *2 MOV R1,R0 ;SAVE REGISTER COUNT ASR R1 ;CONVERT TO # OF REGISTERS DEC R1 ;ADJUST REGISTER COUNT BIS #KS.MBC,K.STS(R2) ;ASSUME WE ARE AN RH70 MOV #$SCDVT,-(SP) ;SETUP TO SCAN DEVICE TABLES 20$: CALL @(SP)+ ;GET NEXT DEVICE IN SYSTEM BCC 25$ ;IF CC WE GOT ONE ; ; SET THE OFFSET TO THE RHBAE REGISTER. ; BIT #FE.EXT,$FMASK ;IS 22-BIT ADDRESSING ENABLED? BEQ 21$ ;IF EQ NO ADD K.OFF(R2),R2 ;POINT TO KRB UCB TABLE SUB #6,R0 ;POINT BACK TO RHBAE MOV R0,KE.RHB(R2) ;STUFF OFFSET TO RHBAE 21$: RETURN ;ALL FINISHED ; ; NOW THAT WE HAVE AN SCB, SEE IF IT IS CONNECTED TO THE KRB ; THAT WE ARE BRINGING ONLINE. ; 25$: BIT #S2.MAD,S.ST2(R4) ;IS THIS SCB MULTI-ACCESSED? BEQ 40$ ;IF EQ NO MOV R4,R5 ;YES, COPY SCB ADDRESS ADD #S.KTB,R5 ;POINT TO START OF KRB TABLE 30$: MOV (R5)+,R3 ;GET NEXT KRB ADDRESS BEQ 20$ ;IF EQ NONE LEFT CMP R3,R2 ;DOES IT POINT TO OUR KRB? BNE 30$ ;IF NE NO BR 50$ ;YES, CHECK # OF REGISTERS 40$: CMP S.KRB(R4),R2 ;DOES IT POINT TO OUR KRB? BNE 20$ ;IF NE NO ; ; NOW WE HAVE THE CORRECT KRB. TEST FOR RH11/70 AND CLEAR ; THE BIT IF WE ARE AN RH11. ; 50$: CMPB R1,S.RCNT(R4) ;REGISTER COUNT FOR RH11? BGT 20$ ;IF GT NO BIC #KS.MBC,K.STS(R2) ;YES, CLEAR MASSBUS BIT BR 20$ ;TRY FOR MORE .ENDC ;+ ; **-$DMKRB-RK611 CONTROLLER ONLINE/OFLINE HANDLER ; ; THIS ENTRY POINT WILL HANDLE RECONFIGURATION CALLS FOR ONLINE ; CONTROLLER AND OFFLINE CONTROLLER FOR THE RK611 CONTROLLER. ; ; FOR BOTH ONLINE AND OFFLINE THE CONTROLLER SUBSYSTEM IS SIMPLY ; CLEARED. THIS TURNS OFF ALL ERROR AND ATTENTION CONDITIONS. ; ; INPUTS: ; R2=KRB ADDRESS. ; ALL OTHER REGISTERS IGNORED. ; ; OUTPUTS: ; CONTROLLER SUBSYSTEM CLEARED. ;- .IF DF R$$611 $DMKRB::BR CONCLR ;GO TO SUBSYSTEM CLEAR AND EXIT ;NOTE: THIS MAKES THE ASSUMPTION ; THAT RKCS2=RHCS2. .ENDC ;+ ; **-$RHPWF-RH11/RH70 CONTROLLER POWER FAIL HANDLER ; **-$DMPWF-RK611 CONTROLLER POWER FAIL HANDLER ; ; THIS ROUTINE WILL HANDLE POWER FAILS FOR THE CONTROLLER. IT ; WILL SET THE SPIN UP BIT FOR THE PORT IF THE DEVICE IS MULTI- ; ACCESSED AND THE SOFTWARE VOLUME VALID BIT WAS PREVIOUSLY SET. ; IT WILL THEN CLEAR THE CONTROLLER SUBSYSTEM. ; ; POWER FAIL FOR EACH UNIT ON THE CONTROLLER IS HANDLED IN THE ; RESPECTIVE DRIVERS. ; ; NOTE: THIS ROUTINE MAKES THE ASSUMPTION THAT RKCS2=RHCS2. ; ; INPUTS: ; R2=KRB ADDRESS. ; ; OUTPUTS: ; R1=CSR ADDRESS ; CONTROLLER SUBSYSTEM IS CLEARED. ;- .IF DF R$$HDV!R$$611 $DMPWF:: ;RK611 POWER FAIL $RHPWF:: ;RH11/70 POWER FAIL MOV #$SCDVT,-(SP) ;SETUP TO SCAN DEVICE TABLES 10$: CALL @(SP)+ ;GET NEXT DEVICE IN SYSTEM BCS CONCLR ;IF CS ALL DONE ; ; NOW THAT WE HAVE A DEVICE, SEE IF IT IS CONNECTED TO OUR KRB AND ; SEE IF IT NEEDS TO BE SPUN UP. ; 20$: BIT #S2.MAD,S.ST2(R4) ;IS THIS SCB MULTI-ACCESSED? BEQ 10$ ;IF EQ NO BITB #US.VV,U.STS(R5);WAS VOLUME VALID SET? BEQ 10$ ;IF EQ NO, FORGET THIS ONE BIT #KP.OFL,S.KTB(R4) ;IS PORT 'A' ONLINE? BNE 30$ ;IF NE NO ; CMP R2,S.KTB(R4) ;IS THIS THE CORRECT KRB? ; BNE 30$ ;IF NE NO BISB #S3.SPA,S.ST3(R4) ;YES, SET PORT 'A' SPINNING UP 30$: BIT #KP.OFL,S.KTB+2(R4) ;IS PORT 'B' ONLINE? BNE 10$ ;IF NE NO ; CMP R2,S.KTB+2(R4) ;IS THIS THE CORRECT KRB? ; BNE 10$ ;IF NE NO BISB #S3.SPB,S.ST3(R4) ;YES, SET PORT 'B' SPINNING UP BR 10$ ;TRY FOR MORE ; ; RETREIVE CONTROLLER CSR ADDRESS AND CLEAR SUBSYSTEM. ; CONCLR: MOV (R2),R1 ;RETREIVE CSR ADDRESS MOV #40,RHCS2(R1) ;CLEAR THE CONTROLLER SUBSYSTEM RETURN ; .ENDC ;+ ; **-$DMCSR-CHECK IF RK611 CSR IS PRESENT ; **-$RHCSR-CHECK IF RH11/RH70 CSR IS PRESENT ; ; THIS ROUTINE WILL TEST THE CONTROLLER WORD COUNT REGISTER TO ; DETERMINE IF IT EXISTS ON THIS PROCESSOR. ; ; INPUTS: ; R2=KRB ADDRESS ; R3=CTB ADDRESS ; $SGFIN MUST HAVE BEEN CALLED BY OUR CALLER. ; ; OUTPUTS: ; C=0 IF CONTROLLER EXISTS ; C=1 IF CONTROLLER DOES NOT EXIST ;- .IF DF R$$HDV!R$$611 $DMCSR:: ;RK611 CONTROLLER TEST $RHCSR:: ;RH11/RH70 CONTROLLER TEST MOV R4,-(SP) ;SAVE A REGISTER MOV (R2),R4 ;RETREIVE CSR ADDRESS TST 2(R4) ;DO WE EXIST? (CHECKS WC REGISTER) MOV (SP)+,R4 ;RESTORE REGISTER RETURN ;RETURN WITH CARRY SET/CLEAR .ENDC .END